﻿using System;
using System.Diagnostics;
using System.IO;
using System.Text;

namespace Kyoh.Lib.Component.Traces
{
    /// <summary><see cref="Debug"/> に出力する <see cref="TextWriter"/> の実装を提供します。</summary>
    public class DebugWriter : TextWriter
    {
        /// <summary>現在のライタのすべてのバッファをクリアし、バッファ内のデータを <see cref="Debug"/> に書き込みます。</summary>
        public override void Flush()
        {
            base.Flush();
        }
        /// <summary>Boolean 値のテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む Boolean。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(bool value)
        {
            Debug.Write(value);
        }
        /// <summary>文字をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">テキスト ストリームに書き込む文字。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(char value)
        {
            Debug.Write(value);
        }
        /// <summary>文字配列をテキスト ストリームに書き込みます。</summary>
        /// <param name="buffer">テキスト ストリームに書き込む文字配列。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(char[] buffer)
        {
            Debug.Write(new string(buffer));
        }
        /// <summary>10 進値のテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む 10 進値。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(decimal value)
        {
            Debug.Write(value);
        }
        /// <summary>8 バイト浮動小数点値のテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む 8 バイト浮動小数点値。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(double value)
        {
            Debug.Write(value);
        }
        /// <summary>4 バイト浮動小数点値のテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む 4 バイト浮動小数点値。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(float value)
        {
            Debug.Write(value);
        }
        /// <summary>4 バイト符号付き整数のテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む 4 バイト符号付き整数。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(int value)
        {
            Debug.Write(value);
        }
        /// <summary>8 バイト符号付き整数のテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む 8 バイト符号付き整数。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(long value)
        {
            Debug.Write(value);
        }
        /// <summary>オブジェクトで ToString を呼び出して、そのオブジェクトのテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込むオブジェクト。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(object value)
        {
            Debug.Write(value);
        }
        /// <summary>文字列をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む文字列。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(string value)
        {
            Debug.Write(value);
        }
        /// <summary>4 バイト符号なし整数のテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む 4 バイト符号なし整数。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        [CLSCompliant(false)]
        public override void Write(uint value)
        {
            Debug.Write(value);
        }
        /// <summary>8 バイト符号なし整数のテキスト形式をテキスト ストリームに書き込みます。</summary>
        /// <param name="value">書き込む 8 バイト符号なし整数。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        [CLSCompliant(false)]
        public override void Write(ulong value)
        {
            Debug.Write(value);
        }
        /// <summary>System.String.Format(System.String,System.Object) と同じセマンティクスを使用して、書式設定された文字列を書き込みます。</summary>
        /// <param name="format">書式指定文字列。</param>
        /// <param name="arg0">書式設定された文字列に書き込むオブジェクト。</param>
        /// <exception cref="System.ArgumentNullException">format が null です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        /// <exception cref="System.FormatException">format の書式指定が無効です。または書式指定される引数を示す数が 0 より小さいか、書式指定される指定したオブジェクトの数以上です。</exception>
        public override void Write(string format, object arg0)
        {
            Debug.Write(string.Format(format, arg0));
        }
        /// <summary>System.String.Format(System.String,System.Object) と同じセマンティクスを使用して、書式設定された文字列を書き込みます。</summary>
        /// <param name="format">書式指定文字列。</param>
        /// <param name="arg">書式設定された文字列に書き込むオブジェクト配列。</param>
        /// <exception cref="System.ArgumentNullException">format または arg が null です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        /// <exception cref="System.FormatException">format の書式指定が無効です。または書式指定される引数を示す数が 0 より小さいか、arg 以上です。Length.</exception>
        public override void Write(string format, params object[] arg)
        {
            Debug.Write(string.Format(format, arg));
        }
        /// <summary>文字の部分配列をテキスト ストリームに書き込みます。</summary>
        /// <param name="buffer">データの書き込み元の文字配列。</param>
        /// <param name="index">バッファ内の開始インデックス。</param>
        /// <param name="count">書き込む文字数。</param>
        /// <exception cref="System.ArgumentException">バッファ長から index を差し引いた値が count より小さい値です。</exception>
        /// <exception cref="System.ArgumentNullException">buffer パラメータが null です。</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">index または count が負の値です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void Write(char[] buffer, int index, int count)
        {
            Debug.Write(new string(buffer, index, count));
        }
        /// <summary>System.String.Format(System.String,System.Object) と同じセマンティクスを使用して、書式設定された文字列を書き込みます。</summary>
        /// <param name="format">書式指定文字列。</param>
        /// <param name="arg0">書式設定された文字列に書き込むオブジェクト。</param>
        /// <param name="arg1">書式設定された文字列に書き込むオブジェクト。</param>
        /// <exception cref="System.ArgumentNullException">format が null です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        /// <exception cref="System.FormatException">format の書式指定が無効です。または書式指定される引数を示す数が 0 より小さいか、書式指定される指定したオブジェクトの数以上です。</exception>
        public override void Write(string format, object arg0, object arg1)
        {
            Debug.Write(string.Format(format, arg0, arg1));
        }
        /// <summary>System.String.Format(System.String,System.Object) と同じセマンティクスを使用して、書式設定された文字列を書き込みます。</summary>
        /// <param name="format">書式指定文字列。</param>
        /// <param name="arg0">書式設定された文字列に書き込むオブジェクト。</param>
        /// <param name="arg1">書式設定された文字列に書き込むオブジェクト。</param>
        /// <param name="arg2">書式設定された文字列に書き込むオブジェクト。</param>
        /// <exception cref="System.ArgumentNullException">format が null です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        /// <exception cref="System.FormatException">format の書式指定が無効です。または書式指定される引数を示す数が 0 より小さいか、書式指定される指定したオブジェクトの数以上です。</exception>
        public override void Write(string format, object arg0, object arg1, object arg2)
        {
            Debug.Write(string.Format(format, arg0, arg1, arg2));
        }
        /// <summary>行終端記号をテキスト ストリームに書き込みます。</summary>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine()
        {
            Debug.WriteLine(string.Empty);
        }
        /// <summary>Boolean 値のテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む Boolean。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(bool value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>文字をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">テキスト ストリームに書き込む文字。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(char value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>文字の配列をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="buffer">データの読み取り元の文字配列。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(char[] buffer)
        {
            Debug.WriteLine(new string(buffer));
        }
        /// <summary>10 進値のテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む 10 進値。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(decimal value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>8 バイト浮動小数点値のテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む 8 バイト浮動小数点値。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(double value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>4 バイト浮動小数点値のテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む 4 バイト浮動小数点値。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(float value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>4 バイト符号付き整数のテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む 4 バイト符号付き整数。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(int value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>8 バイト符号付き整数のテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む 8 バイト符号付き整数。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(long value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>オブジェクトで ToString を呼び出して、そのオブジェクトのテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込むオブジェクト。value が null の場合は、行終端文字だけを書き込みます。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(object value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>文字列をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む文字列。value が null の場合は、行終端文字だけを書き込みます。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(string value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>4 バイト符号なし整数のテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む 4 バイト符号なし整数。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        [CLSCompliant(false)]
        public override void WriteLine(uint value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>8 バイト符号なし整数のテキスト形式をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="value">書き込む 8 バイト符号なし整数。</param>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        [CLSCompliant(false)]
        public override void WriteLine(ulong value)
        {
            Debug.WriteLine(value);
        }
        /// <summary>System.String.Format(System.String,System.Object) と同じセマンティクスを使用して、書式設定された文字列と改行を書き込みます。</summary>
        /// <param name="format">書式指定文字列。</param>
        /// <param name="arg0">書式指定文字列に書き込むオブジェクト。</param>
        /// <exception cref="System.ArgumentNullException">format が null です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        /// <exception cref="System.FormatException">format の書式指定が無効です。または書式指定される引数を示す数が 0 より小さいか、書式指定される指定したオブジェクトの数以上です。</exception>
        public override void WriteLine(string format, object arg0)
        {
            Debug.WriteLine(string.Format(format, arg0));
        }
        /// <summary>System.String.Format(System.String,System.Object) と同じセマンティクスを使用して、書式設定された文字列と改行を書き込みます。</summary>
        /// <param name="format">書式指定文字列。</param>
        /// <param name="arg">書式指定文字列に書き込むオブジェクト。</param>
        /// <exception cref="System.ArgumentNullException">文字列またはオブジェクトが null として渡されました。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        /// <exception cref="System.FormatException">format の書式指定が無効です。または書式指定される引数を示す数値が 0 より小さいか、arg.Length 以上です。</exception>
        public override void WriteLine(string format, params object[] arg)
        {
            Debug.WriteLine(string.Format(format, arg));
        }
        /// <summary>文字の部分配列をテキスト ストリームに書き込み、続けて行終端記号を書き込みます。</summary>
        /// <param name="buffer">データの読み取り元の文字配列。</param>
        /// <param name="index">読み取りの開始位置を示す buffer 内のインデックス。</param>
        /// <param name="count">書き込む文字数の上限。</param>
        /// <exception cref="System.ArgumentException">バッファ長から index を差し引いた値が count より小さい値です。</exception>
        /// <exception cref="System.ArgumentNullException">buffer パラメータが null です。</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">index または count が負の値です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        public override void WriteLine(char[] buffer, int index, int count)
        {
            Debug.WriteLine(new string(buffer, index, count));
        }
        /// <summary>System.String.Format(System.String,System.Object) と同じセマンティクスを使用して、書式設定された文字列と改行を書き込みます。</summary>
        /// <param name="format">書式指定文字列。</param>
        /// <param name="arg0">書式設定された文字列に書き込むオブジェクト。</param>
        /// <param name="arg1">書式設定された文字列に書き込むオブジェクト。</param>
        /// <exception cref="System.ArgumentNullException">format が null です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        /// <exception cref="System.FormatException">format の書式指定が無効です。または書式指定される引数を示す数が 0 より小さいか、書式指定される指定したオブジェクトの数以上です。</exception>
        public override void WriteLine(string format, object arg0, object arg1)
        {
            Debug.WriteLine(string.Format(format, arg0, arg1));
        }
        /// <summary>System.String.Format(System.String,System.Object) と同じセマンティクスを使用して、書式設定された文字列と改行を書き込みます。</summary>
        /// <param name="format">書式指定文字列。</param>
        /// <param name="arg0">書式設定された文字列に書き込むオブジェクト。</param>
        /// <param name="arg1">書式設定された文字列に書き込むオブジェクト。</param>
        /// <param name="arg2">書式設定された文字列に書き込むオブジェクト。</param>
        /// <exception cref="System.ArgumentNullException">format が null です。</exception>
        /// <exception cref="System.ObjectDisposedException">System.IO.TextWriter が閉じています。</exception>
        /// <exception cref="System.IO.IOException">I/O エラーが発生しました。</exception>
        /// <exception cref="System.FormatException">format の書式指定が無効です。または書式指定される引数を示す数が 0 より小さいか、書式指定される指定したオブジェクトの数以上です。</exception>
        public override void WriteLine(string format, object arg0, object arg1, object arg2)
        {
            Debug.WriteLine(string.Format(format, arg0, arg1, arg2));
        }

        /// <summary>出力の書き込み時に適用する <see cref="Encoding"/> を取得します。</summary>
        public override Encoding Encoding
        {
            get { return Encoding.Default; }
        }
    }
}